/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.fermojupi.AtoCampo;
import br.com.deployment.entidade.fermojupi.AtoItem;
import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entidade.protocolo.Parcela;
import br.com.deployment.entidade.protocolo.Protocolo;
import br.com.deployment.entidade.protocolo.ProtocoloCampo;
import br.com.deployment.entidade.protocolo.ServicoProtocolo;
import br.com.deployment.entity.orcamento.Orcamento;
import br.com.deployment.enums.FormasPagamento;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.AtoCampoServico;
import br.com.deployment.servico.AtoItemServico;
import br.com.deployment.servico.OrcamentoServico;
import br.com.deployment.servico.PessoaServico;
import br.com.deployment.servico.ProtocoloServico;
import br.com.deployment.utilitario.VOServicoProtocoloAtoCampo;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author roniere
 */
@ManagedBean
@SessionScoped
public class ManagerProtocolo implements Serializable {

    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    AtoItemServico atoItemServico;
    @EJB
    AtoCampoServico atoCampoServico;
    @EJB
    OrcamentoServico orcamentoServico;
    @EJB
    PessoaServico pessoaServico;
    private Protocolo protocolo;
    private ServicoProtocolo servicoProtocolo;
    private ServicoProtocolo spVisualizar;
    private List<ServicoProtocolo> listSP;
    private List<ProtocoloCampo> listPC;
    private BigDecimal sumCartorio;
    private BigDecimal sumFermojupi;
    private BigDecimal sumTotal;
    private BigDecimal recebido;
    private BigDecimal troco;
    private Pessoa pessoa;
    private BigDecimal entrada;
    private boolean parc;
    private int qtdParc;
    private List<Parcela> listParcelas;

    public ManagerProtocolo() {
        System.err.println("Manager");
    }

    @PostConstruct
    public void init() {
        System.err.println("Init");
        this.servicoProtocolo = new ServicoProtocolo();
        this.protocolo = new Protocolo();
        this.listSP = new ArrayList<ServicoProtocolo>();
        this.listPC = new ArrayList<ProtocoloCampo>();

        sumCartorio = new BigDecimal("0");
        sumFermojupi = new BigDecimal("0");
        sumTotal = new BigDecimal("0");
        recebido = new BigDecimal("0");
        troco = new BigDecimal("0");

        entrada = new BigDecimal("0");
        parc = false;
        pessoa = new Pessoa();

    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public List<Parcela> getListParcelas() {
        return listParcelas;
    }

    public void setListParcelas(List<Parcela> listParcelas) {
        this.listParcelas = listParcelas;
    }

    public int getQtdParc() {
        return qtdParc;
    }

    public void setQtdParc(int qtdParc) {
        this.qtdParc = qtdParc;
    }

    public ServicoProtocolo getSpVisualizar() {
        return spVisualizar;
    }

    public void setSpVisualizar(ServicoProtocolo spVisualizar) {
        this.spVisualizar = spVisualizar;
    }

    public BigDecimal getTroco() {
        return troco;
    }

    public void setTroco(BigDecimal troco) {
        this.troco = troco;
    }

    public BigDecimal getRecebido() {
        return recebido;
    }

    public void setRecebido(BigDecimal recebido) {
        this.recebido = recebido;
    }

    public BigDecimal getSumCartorio() {
        return sumCartorio;
    }

    public void setSumCartorio(BigDecimal sumCartorio) {
        this.sumCartorio = sumCartorio;
    }

    public BigDecimal getSumFermojupi() {
        return sumFermojupi;
    }

    public void setSumFermojupi(BigDecimal sumFermojupi) {
        this.sumFermojupi = sumFermojupi;
    }

    public BigDecimal getSumTotal() {
        return sumTotal;
    }

    public void setSumTotal(BigDecimal sumTotal) {
        this.sumTotal = sumTotal;
    }

    public void reinit() {
        this.servicoProtocolo = new ServicoProtocolo();
        this.listPC = new ArrayList<ProtocoloCampo>();
    }

    public boolean isParc() {
        return parc;
    }

    public void setParc(boolean parc) {
        this.parc = parc;
    }

    public BigDecimal getEntrada() {
        return entrada;
    }

    public void setEntrada(BigDecimal entrada) {
        this.entrada = entrada;
    }

    public List<ProtocoloCampo> getListPC() {
        return listPC;
    }

    public void setListPC(List<ProtocoloCampo> listPC) {
        this.listPC = listPC;
    }

    public List<ServicoProtocolo> getListSP() {
        return listSP;
    }

    public void setListSP(List<ServicoProtocolo> listSP) {
        this.listSP = listSP;
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public ServicoProtocolo getServicoProtocolo() {
        return servicoProtocolo;
    }

    public void setServicoProtocolo(ServicoProtocolo servicoProtocolo) {
        this.servicoProtocolo = servicoProtocolo;
    }

    public void salvar() {
        System.err.println("Salvando...");
        
        if (!parcelado()) {
            return;
        }

        this.protocolo.setParcelas(listParcelas);
        this.protocolo.setServicoProtocolos(listSP);
        protocolo = protocoloServico.salvar(protocolo);
    }
    
    public void relatorioProtocoloRecibo(){
         protocoloServico.relatorioProtocoloRecibo(protocolo.getId());
    }

    public void recept(Orcamento p) {
        init();
        this.protocolo = protocoloServico.orcamentoToProtocolo(p);
        this.listSP = protocolo.getServicoProtocolos();
        this.pessoa = protocolo.getCliente();
        for (ServicoProtocolo sp : listSP) {
            somaCartorio(sp.getValorCartorio());
            somaFermojupi(sp.getValorFermojupi());
            somaTotal(sp.getValor());
        }
        redirect("protocolo.xhtml");
    }

    public void redirect(String string) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            context.getExternalContext().redirect(string);
        } catch (IOException ex) {
            Logger.getLogger(ManagerProtocolo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void gerarCampos(SelectEvent event) {

        AtoItem atoItem = (AtoItem) event.getObject();
        atoItem = atoItemServico.find(atoItem.getId());
        gerarCamposAtoItem(atoItem);
    }

    public void gerarCampos(AtoItem ai) {
        gerarCamposAtoItem(atoItemServico.find(ai.getId()));
    }

    public void gerarCamposAtoItem(AtoItem atoItem) {
        atoItem = atoItemServico.find(atoItem.getId());

        servicoProtocolo.setAtoItem(atoItem);
        List<AtoCampo> atoCampo = atoCampoServico.getCampos(atoItem);
        listPC.clear();

        for (AtoCampo ac : atoCampo) {
            ProtocoloCampo pc = new ProtocoloCampo();
            pc.setAtoCampo(ac);
            listPC.add(pc);
        }

    }

    public void addServico() {
        System.err.println("ADD");
        BigDecimal valor = new BigDecimal("0.0");

        List<BigDecimal> valorAto = new ArrayList<BigDecimal>();
        servicoProtocolo.setProtocoloCampos(listPC);
        VOServicoProtocoloAtoCampo spac = protocoloServico.valorAtoProtocolo(servicoProtocolo);

        valorAto = spac.getValorAto();
        servicoProtocolo.setAtoItem(spac.getSp().getAtoItem());

        servicoProtocolo.setValorCartorio(valorAto.get(0) == null ? new BigDecimal(BigInteger.ZERO) : valorAto.get(0));
        somaCartorio(servicoProtocolo.getValorCartorio());

        servicoProtocolo.setValorFermojupi(valorAto.get(1) == null ? new BigDecimal(BigInteger.ZERO) : valorAto.get(1));
        somaFermojupi(servicoProtocolo.getValorFermojupi());

        servicoProtocolo.setValor(valorAto.get(2) == null ? new BigDecimal(BigInteger.ZERO) : valorAto.get(2));
        somaTotal(servicoProtocolo.getValor());

        System.err.println(servicoProtocolo.getProtocoloCampos());


        listSP.add(servicoProtocolo);
        reinit();


    }

    private void somaCartorio(BigDecimal cart) {
        sumCartorio = sumCartorio.add(cart);
    }

    private void somaFermojupi(BigDecimal ferm) {
        sumFermojupi = sumFermojupi.add(ferm);
    }

    private void somaTotal(BigDecimal tot) {
        sumTotal = sumTotal.add(tot).setScale(2, RoundingMode.DOWN);
    }

    private void subCartorio(BigDecimal cart) {
        sumCartorio = sumCartorio.subtract(cart);
    }

    private void subFermojupi(BigDecimal ferm) {
        sumFermojupi = sumFermojupi.subtract(ferm);
    }

    private void subTotal(BigDecimal tot) {
        sumTotal = sumTotal.subtract(tot);
    }

    private BigDecimal format(ProtocoloCampo oc) {

        if (oc.getAtoCampo().getCalc()) {

            oc.setValor(oc.getValor().replace(".", "").replaceAll(",", "."));
            BigDecimal val = new BigDecimal(oc.getValor());
            return val;
        }

        return null;
    }

    public void caixa() {
        if (recebido != null) {
            if (!recebido.equals(BigDecimal.ZERO)) {
                troco = recebido.subtract(sumTotal);
            }
        } else {
            troco = BigDecimal.ZERO;
        }

    }

    public int resgateId(String key) {
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String x = (String) map.get(key);
        int ds = Integer.parseInt(x);
        return ds;
    }

    public void editarList() {
        int index = resgateId("paramProAto");
        servicoProtocolo = listSP.get(index);
        if (!servicoProtocolo.getProtocoloCampos().isEmpty()) {
            gerarCampos(servicoProtocolo.getAtoItem());
        }
        subCartorio(servicoProtocolo.getValorCartorio());
        subFermojupi(servicoProtocolo.getValorFermojupi());
        subTotal(servicoProtocolo.getValor());
        listSP.remove(index);

    }

    public void remove() {
        int index = resgateId("paramRemoverProAto");
        ServicoProtocolo spRem = listSP.get(index);
        subCartorio(spRem.getValorCartorio());
        subFermojupi(spRem.getValorFermojupi());
        subTotal(spRem.getValor());
        listSP.remove(index);
    }

    public void showDialog() {
        spVisualizar = new ServicoProtocolo();
        int index = resgateId("paramShowProAto");
        spVisualizar = listSP.get(index);
    }

    public void cliente(Pessoa p) {
        System.err.println("Pessoa" + p.getId());
        pessoa = pessoaServico.find(p.getId());
        protocolo.setCliente(pessoa);
        Msg.messagemInfo("Cliente adicionado !");
    }

    public SelectItem[] selectItemFormPag() {
        SelectItem[] items = new SelectItem[FormasPagamento.values().length];
        int i = 0;
        for (FormasPagamento tipo : FormasPagamento.values()) {
            items[i++] = new SelectItem(tipo, tipo.getNome());
        }
        return items;
    }

    public void verificaPag() {
        this.parc = this.protocolo.getFormasPagamento() == FormasPagamento.PARC ? true : false;

    }

    public boolean parcelado() {
        listParcelas = new ArrayList<Parcela>();

        if (this.protocolo.getFormasPagamento() == FormasPagamento.PARC) {
            if (entrada.compareTo(sumFermojupi) != -1) {
                System.err.println("Pagamento  - Parcelado");

                Parcela p = new Parcela();
                p.setValorPago(entrada);
                p.setValorAPagar(entrada);
                p.setAtivo(false);
                p.setDataPag(new Date());
                listParcelas.add(p);

                BigDecimal pv = new BigDecimal("0");
                pv = sumTotal.subtract(entrada);

                for (int i = 1; i < qtdParc; i++) {

                    p = new Parcela();
                    p.setValorAPagar(pv.divide(new BigDecimal(qtdParc - 1)).setScale(2, RoundingMode.DOWN));
                    p.setValorPago(BigDecimal.ZERO);
                    p.setAtivo(true);
                    listParcelas.add(p);


                }

            } else {
                Msg.messagemError("A entrada deve ser superior ao fermojupi");
                return false;
            }

        } else {

            Parcela p = new Parcela();
            BigDecimal aPagar = recebido.subtract(troco);

            if (aPagar.compareTo(new BigDecimal(BigInteger.ZERO)) == -1
                    || aPagar.compareTo(new BigDecimal(BigInteger.ZERO)) == 0) {
                p.setValorPago(sumTotal);
            } else {
                p.setValorPago(aPagar);
            }
            p.setValorAPagar(sumTotal);
            p.setDataPag(new Date());
            p.setAtivo(false);
            listParcelas.add(p);


        }
        return true;
    }
    
    public void emitirRecibo(){
        protocoloServico.relatorioProtocoloRecibo(qtdParc);
    }
}
